
/* -----------------
* brief 
* 1. this is code gen by tools 
* 2. array like [a,b,c] after each field, define the ui html tag in view, 
		a for title, 
		b for show or not ,  
		c for element html tag , currently support : check、radio、select、input、textarea、upload
* 3. XXX
*/

package wechat

import (
	"github.com/chanxuehong/wechat/mp/card"
	"github.com/mjiulee/lego"
	"saas_sys_base/common"
)

func init() {
	lego.AddBeanToSynList(new(WxCard))
}

/* table: "tb_wx_card"
 * -----------------
*/
type WxCard struct {
	Id        int64  `xorm:"pk"`                  // ["id","hide","hidden"]
	IfDel     int `xorm:"default 0"` // ["deleted","hide","hidden"]
	Cdate     string `xorm:"DateTime created"`    // ["create","show","datetime"]
	Udate     string `xorm:"DateTime updated"`    // ["update","show","datetime"]
    // add your custom field here
    //
    common.Who `xorm:"extends"` //["Who","show","input"]

    /*
    几个比较关键的字段
    CardBaseInfo.Status:卡状态，值如 CARD_STATUS_NOT_VERIFY
    CardBaseInfo.CardType:值如 MEMBER_CARD
     */
    //card attr
	CardType string `xorm:"varchar(32)"`
	//CardBaseInfoJson card.CardBaseInfo `xorm:"json"`
	//CardAdvInfoJson card.AdvancedInfo `xorm:"json"`

	*card.CardBaseInfo `xorm:"extends"`
	*card.AdvancedInfo `xorm:"extends"`

	RefuseReason string `xorm:""`

	/*
	CardId在CardBaseInfoStruct里面
	*/
	//CardBaseInfoStruct `xorm:"extends"`
	//AdvancedInfoStruct `xorm:"extends"`

}

func NewWxCard(who common.Who, cardpara *card.Card) *WxCard {
	wxCard := new(WxCard)
	wxCard.Who = who
	wxCard.CardType = cardpara.CardType
	if cardpara.CardType == card.CardTypeMemberCard && cardpara.MemberCard.BaseInfo != nil && cardpara.MemberCard.AdvancedInfo != nil {
		wxCard.CardBaseInfo = cardpara.MemberCard.BaseInfo
		wxCard.AdvancedInfo = cardpara.MemberCard.AdvancedInfo
	} else {
		return nil
	}

	return wxCard
}

//这个接口和chanxuehong的card.CardBaseInfo一致
type CardBaseInfoStruct struct {
	CardId string `xorm:"'base_card_id'"`     // 查询的时候有返回
	Status string `xorm:"base_status"` // 查询的时候有返回
	AppId  string `xorm:"base_appid"`  // 查询的时候有返回

	//SubMerchantInfo *card.CardSubMerchantInfo `json:"sub_merchant_info,omitempty"` //第三方制卡模式中，创建子商户卡券的参数
	CardMerchantId int `xorm:"base_merchant_id"`

	LogoURL     string    `xorm:"base_logo_url"`    // 卡券的商户logo，建议像素为300*300。
	CodeType    string    `xorm:"base_code_type"`   // Code展示类型
	BrandName   string    `xorm:"base_brand_name"`  // 商户名字,字数上限为12个汉字。
	Title       string    `xorm:"base_title"`       // 卡券名，字数上限为9个汉字。(建议涵盖卡券属性、服务及金额)。
	SubTitle    string    `xorm:"base_sub_title"`   // 券名的副标题, 字数上限为18个汉字。
	Color       string    `xorm:"base_color"`       // 券颜色。按色彩规范标注填写Color010-Color100。
	Notice      string    `xorm:"base_notice"`      // 卡券使用提醒，字数上限为16个汉字。
	Description string    `xorm:"base_description"` // 卡券使用说明，字数上限为1024个汉字。

	//SKU         *card.SKU      `xorm:"base_sku,omitempty"`         // 商品信息。
	Quantity int `xorm:"base_sku_quantity"` // 卡券库存的数量，不支持填写0，上限为100000000。

	//DateInfo    *card.DateInfo `xorm:"base_date_info,omitempty"`   // 使用日期，有效期的信息。
	//di表示data_info
	Type           string `xorm:"base_di_type"`                       // 使用时间的类型, DATE_TYPE_FIX_TIME_RANGE 表示固定日期区间，DATE_TYPE_FIX_TERM表示固定时长（自领取后按天算）
	BeginTimestamp int64  `xorm:"base_di_begin_timestamp"`  // type为DATE_TYPE_FIX_TIME_RANGE时专用，表示起用时间。从1970年1月1日00:00:00至起用时间的秒数，最终需转换为字符串形态传入。（东八区时间，单位为秒）
	EndTimestamp   int64  `xorm:"base_di_end_timestamp"`    // type为DATE_TYPE_FIX_TIME_RANGE时专用，表示结束时间，建议设置为截止日期的23:59:59过期。（东八区时间，单位为秒）
	FixedTerm      *int   `xorm:"base_di_fixed_term"`       // type为DATE_TYPE_FIX_TERM时专用，表示自领取后多少天内有效，领取后当天有效填写0。（单位为天）
	FixedBeginTerm *int   `xorm:"base_di_fixed_begin_term"` // type为DATE_TYPE_FIX_TERM时专用，表示自领取后多少天开始生效。（单位为天）

	UseCustomCode        bool   `xorm:"base_use_custom_code"`         // 是否自定义Code码。填写true或false，默认为false。通常自有优惠码系统的开发者选择自定义Code码，并在卡券投放时带入Code码
	BindOpenId           bool   `xorm:"base_bind_openid"`             // 是否指定用户领取，填写true或false。默认为false。通常指定特殊用户群体投放卡券或防止刷券时选择指定用户领取。
	ServicePhone         string  `xorm:"base_service_phone"`           // 客服电话。
	LocationIdList       []int64 `xorm:"base_location_id_list"`        // 门店位置poiid。
	Source               string  `xorm:"base_source"`                  // 第三方来源名，例如同程旅游、大众点评。
	CustomURLName        string  `xorm:"base_custom_url_name"`         // 自定义跳转外链的入口名字。
	CustomURLSubTitle    string  `xorm:"base_custom_url_sub_title"`    // 显示在入口右侧的提示语。
	CustomURL            string  `xorm:"base_custom_url"`              // 自定义跳转的URL。
	PromotionURLName     string  `xorm:"base_promotion_url_name"`      // 营销场景的自定义入口名称。
	PromotionURLSubTitle string  `xorm:"base_promotion_url_sub_title"` // 显示在营销入口右侧的提示语。
	PromotionURL         string  `xorm:"base_promotion_url"`           // 入口跳转外链的地址链接。
	GetLimit             int    `xorm:"base_get_limit"`               // 每人可领券的数量限制,不填写默认为50。
	UseLimit             int    `xorm:"base_use_limit"`               // 每人使用次数限制.
	CanShare             bool   `xorm:"base_can_share"`               // 卡券领取页面是否可分享。
	CanGiveFriend        bool   `xorm:"base_can_give_friend"`         // 卡券是否可转赠。
}


func (t *CardBaseInfoStruct)SyncFrom(src *card.CardBaseInfo) {
	//以下是复制到对应字段
	t.CardId = src.CardId
	t.Status = src.Status
	t.AppId = src.AppId

	//SubMerchantInfo *card.CardSubMerchantInfo `json:"sub_merchant_info,omitempty"` //第三方制卡模式中，创建子商户卡券的参数
	t.CardMerchantId = t.CardMerchantId

	t.LogoURL = src.LogoURL
	t.CodeType = src.CodeType
	t.BrandName = src.BrandName
	t.Title = src.Title
	t.SubTitle = src.SubTitle
	t.Color = src.Color
	t.Notice = src.Notice
	t.Description = src.Description

	//SKU         *card.SKU      `xorm:"base_sku,omitempty"`         // 商品信息。
	t.Quantity = src.SKU.Quantity// 卡券库存的数量，不支持填写0，上限为100000000。

	//DateInfo    *card.DateInfo `xorm:"base_date_info,omitempty"`   // 使用日期，有效期的信息。
	//di表示data_info
	t.Type = src.DateInfo.Type
	t.BeginTimestamp = src.DateInfo.BeginTimestamp
	t.EndTimestamp = src.DateInfo.EndTimestamp
	t.FixedTerm = src.DateInfo.FixedTerm
	t.FixedBeginTerm = src.DateInfo.FixedBeginTerm

	if src.UseCustomCode != nil {
		t.UseCustomCode = *src.UseCustomCode
	}

	if src.BindOpenId != nil {
		t.BindOpenId = *src.BindOpenId
	}

	t.ServicePhone = src.ServicePhone
	t.LocationIdList = src.LocationIdList
	t.Source = src.Source
	t.CustomURLName = src.CustomURLName
	t.CustomURLSubTitle = src.CustomURLSubTitle
	t.CustomURL = src.CustomURL
	t.PromotionURLName = src.PromotionURLName
	t.PromotionURLSubTitle = src.PromotionURLSubTitle
	t.PromotionURL = src.PromotionURL
	/*if src.GetLimit != nil {
		t.GetLimit = *src.GetLimit
	}*/
	t.GetLimit = src.GetLimit

	if src.UseLimit != nil {
		t.UseLimit = *src.UseLimit
	}

	if src.CanShare != nil {
		t.CanShare = *src.CanShare
	}

	if src.CanGiveFriend != nil {
		t.CanGiveFriend = *src.CanGiveFriend
	}

}

type AdvancedInfoStruct struct {
	//UseCondition    *card.UseCondition   `json:"use_condition,omitempty"`    //使用门槛（条件）字段，若不填写使用条件则在券面拼写 ：无最低消费限制，全场通用，不限品类；并在使用说明显示： 可与其他优惠共享
	//uc代表UseCondition
	AcceptCategory          string `xorm:"adv_uc_accept_category,omitempty"` //指定可用的商品类目，仅用于代金券类型 ，填入后将在券面拼写适用于xxx
	RejectCategory          string `xorm:"adv_uc_reject_category,omitempty"` //指定不可用的商品类目，仅用于代金券类型 ，填入后将在券面拼写不适用于xxxx
	LeastCost               int    `xorm:"adv_uc_least_cost,omitempty"`      //满减门槛字段，可用于兑换券和代金券 ，填入后将在全面拼写消费满xx元可用。
	CanUseWithOtherDiscount bool   `xorm:"adv_uc_can_use_with_other_discount,omitempty"`

	//Abstract        *card.Abstract       `xorm:"abstract,omitempty"`         //封面摘要结构体名称
	Abstract    string   `json:"abstract,omitempty"`      //封面摘要简介。
	IconURLList []string `json:"abstract_icon_url_list,omitempty"` //封面图片列表，仅支持填入一 个封面图片链接， 上传图片接口 上传获取图片获得链接，填写 非CDN链接会报错，并在此填入。 建议图片尺寸像素850*350


	//TextImageList   []card.TextImageList `xorm:"text_image_list,omitempty"`  //图文列表，显示在详情内页 ，优惠券券开发者须至少传入 一组图文列表
	TextImageList  []struct {
		ImageURL string `json:"image_url,omitempty"` //图片链接，必须调用 上传图片接口 上传图片获得链接，并在此填入， 否则报错
		Text     string `json:"text,omitempty"`      //图文描述
	} `xorm:"text_image_list json"`
	TimeLimit       []struct {
		Type        string `json:"type,omitempty"`         //限制类型枚举值：支持填入 MONDAY 周一 TUESDAY 周二 WEDNESDAY 周三 THURSDAY 周四 FRIDAY 周五 SATURDAY 周六 SUNDAY 周日 此处只控制显示， 不控制实际使用逻辑，不填默认不显示
		BeginHour   int    `json:"begin_hour,omitempty"`   //当前type类型下的起始时间（小时） ，如当前结构体内填写了MONDAY， 此处填写了10，则此处表示周一 10:00可用
		EndHour     int    `json:"end_hour,omitempty"`     //当前type类型下的起始时间（分钟） ，如当前结构体内填写了MONDAY， begin_hour填写10，此处填写了59， 则此处表示周一 10:59可用
		BeginMinute int    `json:"begin_minute,omitempty"` //当前type类型下的结束时间（小时） ，如当前结构体内填写了MONDAY， 此处填写了20， 则此处表示周一 10:00-20:00可用
		EndMinute   int    `json:"end_minute,omitempty"`
	}     `xorm:"time_limit json"`       //使用时段限制，包含以下字段
	BusinessService []string        `xorm:"business_service"` //商家服务类型： BIZ_SERVICE_DELIVER 外卖服务； BIZ_SERVICE_FREE_PARK 停车位； BIZ_SERVICE_WITH_PET 可带宠物； BIZ_SERVICE_FREE_WIFI 免费wifi， 可多选
}